package com.yunsom.testdemo.multiple_thread.threadpooltest1;

import com.yunsom.testdemo.dao.UrlDetail;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author Xbao
 * @description
 * @date 2022/5/10 17:13
 */
public class GetMonitorDataService {

  /**
   * 从数据库中获取url，并利用httpclient循环访问url地址，并对返回结果进行操作
   * @throws InterruptedException
   */
  public void sendData() throws InterruptedException {

    //模拟从数据库中查询所有url
    List<String> list = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
      list.add(i + "");
    }
    System.out.println("此次查询数据库中监控url个数为" + list.size());

    //获取系统处理器个数，作为线程池数量
    int nThreads = Runtime.getRuntime().availableProcessors();

    //定义一个装载多线程返回值的集合
    List<UrlDetail> result = Collections.synchronizedList(new ArrayList<UrlDetail>());
    //创建线程池，这里定义了一个创建线程池的工具类，避免了创建多个线程池，ThreadPoolFactoryUtil可以使用单例模式设计
    ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
    //遍历数据库取出的url
    if (list != null && list.size() > 0) {
      for (String url : list) {
        //创建任务
        ThreadTask threadTask = new ThreadTask(url, result);
        //执行任务
        executorService.execute(threadTask);
      }

      executorService.shutdown();

      while (!executorService.awaitTermination(1, TimeUnit.SECONDS)) {
        System.out.println("线程池没有关闭");
      }
      System.out.println("线程池已经关闭");

    }

    //对数据进行保存等操作
    System.out.println(result.size());
  }
}